home *** CD-ROM | disk | FTP | other *** search
- ╒═══════════════════════════════╕
- │ W E L C O M E │
- │ To the VGA Trainer Program │ │
- │ By │ │
- │ DENTHOR of ASPHYXIA │ │ │
- │ (updated by Snowman) │ │ │
- ╘═══════════════════════════════╛ │ │
- ────────────────────────────────┘ │
- ────────────────────────────────┘
-
- --==[ PART 9 ]==--
-
-
- [Note: things in brackets have been added by Snowman. The original text
- has remained mostly unaltered except for the inclusion of C++ material]
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- ■ Introduction
-
- Hi there! ASPHYXIA is BACK with our first MegaDemo, Psycho Neurosis! A
- paltry 1.3MB download is all it takes to see the group from Durbs first
- major production! We are quite proud of it, and think you should see it
- ;)
-
- Secondly, I released a small little trainer (a trainerette ;-)) on
- RsaPROG and Connexctix BBS mail, also on the ASPHYXIA BBS as COPPERS.ZIP
- It is a small Pascal program demonstrating how to display copper bars in
- text mode. Also includes a check for horizontal retrace (A lot of people
- wanted it, that is why I wrote the program) (ASPHYXIA ... first with the
- trainer goodies ;-) aargh, sorry, had to be done ))
-
- Thirdly, sorry about the problems with Tut 8! If you had all the
- checking on, the tutorial would probably die on the first points. The
- reason is this : in the first loop, we have DrawPoints then
- RotatePoints. The variables used in DrawPoints are set in RotatePoints,
- so if you put RotatePoints before DrawPoints, the program should work
- fine. Alternatively, turn off error checking 8-)
-
- Fourthly, I have had a surprisingly large number of people saying that
- "I get this, like, strange '286 instructions not enabled' message!
- What's wrong with your code, dude?" To all of you, get into Pascal, hit
- Alt-O (for options), hit enter and a 2 (for Enable 286 instructions). Hard
- hey? Doesn't anyone EVER set up their version of Pascal?
-
- Now, on to todays tutorial! 3D solids. That is what the people wanted,
- that is what the people get! This tutorial is mainly on how to draw the
- polygon on screen. For details on how the 3D stuff works, check out tut
- 8.
-
-
-
- If you would like to contact me, or the team, there are many ways you
- can do it : 1) Write a message to Grant Smith/Denthor/Asphyxia in private mail
- on the ASPHYXIA BBS.
- 2) Write to Denthor, EzE or Goth on Connectix.
- 3) Write to : Grant Smith
- P.O.Box 270 Kloof
- 3640
- Natal
- 4) Call me (Grant Smith) at (031) 73 2129 (leave a message if you
- call during varsity)
- 5) Write to mcphail@beastie.cs.und.ac.za on InterNet, and
- mention the word Denthor near the top of the letter.
-
- NB : If you are a representative of a company or BBS, and want ASPHYXIA
- to do you a demo, leave mail to me; we can discuss it.
- NNB : If you have done/attempted a demo, SEND IT TO ME! We are feeling
- quite lonely and want to meet/help out/exchange code with other demo
- groups. What do you have to lose? Leave a message here and we can work
- out how to transfer it. We really want to hear from you!
-
-
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- ■ How to draw a polygon
-
- Sounds easy enough, right? WRONG! There are many, many different ways to
- go about this, and today I'll only be showing you one. Please don't take
- what is written here as anything approaching the best method, it is just
- here to get you on your way...
-
- The procedure I will be using here is based on something most of us
- learned in standard eight ... I think. I seem to recall doing something
- like this in Mrs. Reids maths class all those years ago ;)
-
- Take two points, x1,y1 and x2,y2. Draw them :
-
- + (x1,y1)
- \
- \ <-- Point a somewhere along the line
- \
- + (x2,y2)
-
- Right, so what we have to do is this : if we know the y-coord of a, what
- is it's x-coord? To prove the method we will give the points random
- values.
-
- + (2,10)
- \
- \ <-- a.y = 12
- \
- + (15,30)
-
- Right. Simple enough problem. This is how we do it :
- (a.y-y1) = (12 - 10) {to get a.y as though y1 was zero}
- *(x2-x1) = *(15 - 2) {the total x-length of the line}
- /(y2-y1) = /(30 - 10) {the total y-length of the line}
- +x1 = +2 { to get the equation back to real coords}
-
- So our equation is : (a.y-y1)*(x2-x1)/(y2-y1)+x4 or
- (12-10)*(15-2)/(30-10)+2
- which gives you :
- 2*13/20+2 = 26/20+2
- = 3.3
-
- That means that along the line with y=12, x is equal to 3.3. Since we
- are not concerned with the decimal place, we replace the / with a div,
- which in Pascal gives us an integer result, and is faster too. All well
- and good, I hear you cry, but what does this have to do with life and
- how it relates to polygons in general. The answer is simple. For each of
- the four sides of the polygon we do the above test for each y line. We
- store the smallest and the largest x values into separate variables for
- each line, and draw a horizontal line between them. Ta-Dah! We have a
- cool polygon!
-
- For example : Two lines going down :
-
- + +
- / <-x1 x2->| <--For this y line
- / |
- + +
-
- Find x1 and x2 for that y, then draw a line between them. Repeat for all
- y values.
-
- Of course, it's not as simple as that. We have to make sure we only
- check those y lines that contain the polygon (a simple min y, max y test
- for all the points). We also have to check that the line we are
- calculating actually extends as far as where our current y is (check
- that the point is between both y's). We have to compare each x to see
- weather it is smaller then the minimum x value so far, or bigger then
- the maximum (the original x min is set as a high number, and the x max
- is set as a small number). We must also check that we only draw to the
- place that we can see ( 0-319 on the x ; 0-199 on the y (the size of the
- MCGA screen))
-
- To see how this looks in practice, have a look at the sample code
- provided. (Mrs. Reid would probably kill me for the above explanation,
- so when you learn it in school, split it up into thousands of smaller
- equations to get the same answer ;))
-
- Okay, that's it! What's that? How do you draw a vertical line? Thats
- simple ...
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- ■ Drawing a vertical line
-
- Right, this is a lot easier than drawing a normal line (Tut 5 .. I
- think), because you stay on the same y value. So, what you do is you set
- ES to the screen you want to write to, and get DI to the start of the
- y-line (see earlier trainers for a description of how SEGMENT:OFFSET
- works.
-
- IN : x1 , x2, y, color, where
-
- asm
- mov ax,where
- mov es,ax
- mov di,y
- mov ax,y
- shl di,8 { di:=di*256 }
- shl ax,6 { ax:=ax*64 }
- add di,ax { di := (y*256)+(y*64) := y*320 Faster then a
- straight multiplication }
-
- Right, now you add the first x value to get your startoff.
- add di,x1
- Move the color to store into ah and al
- mov al,color
- mov ah,al { ah:=al:=color }
- then get CX equal to how many pixels across you want to go
- mov cx,x2
- sub cx,x1 { cx:=x2-x1 }
- Okay, as we all know, moving a word is a lot faster then moving a byte,
- so we halve CX
- shr cx,1 { cx:=cx/2 }
- but what happens if CX was an odd number. After a shift, the value of
- the last number is placed in the carry flag, so what we do is jump over
- a single byte move if the carry flag is zero, or execute it if it is
- one.
- jnc @Start { If there is no carry, jump to label Start }
- stosb { ES:[DI]:=al ; increment DI }
- @Start : { Label Start }
- rep stosw { ES:[DI]:=ax ; DI:=DI+2; repeat CX times }
-
- Right, the finished product looks like this :
-
- [Pascal]
-
- Procedure Hline (x1,x2,y:word;col:byte;where:word); assembler;
- { This draws a horizontal line from x1 to x2 on line y in color col }
- asm
- mov ax,where
- mov es,ax
- mov ax,y
- mov di,ax
- shl ax,8
- shl di,6
- add di,ax
- add di,x1
-
- mov al,col
- mov ah,al
- mov cx,x2
- sub cx,x1
- shr cx,1
- jnc @start
- stosb
- @Start :
- rep stosw
- end;
-
- [C++]
-
- void Hline (word X1, word X2, word Y, byte Col, word Where) {
- asm {
- mov ax, [Where] // move segment of Where to AX
- mov es, ax // set ES to segment of Where
- mov ax, [Y] // set AX to Y
- mov di, ax // set DI to Y
- shl ax, 8 // shift AX left 8 places (multiply Y by 256)
- shl di, 6 // shift DI left 6 places (multiply Y by 64)
- add di, ax // add AX to DI (Y*64 + Y*256 = Y*320)
- add di, [X1] // add the X1 offset to DI
- mov al, [Col] // move Col to AL
- mov ah, al // move Col to AH (we want 2 copies for word moving)
- mov cx, [X2] // move X2 to CX
- sub cx, [X1] // move the change in X to CX
- shr cx, 1 // divide change in X by 2 (for word moving)
- jnc Start // if we have an even number of moves, go to Start
- stosb // otherwise, move one byte more
- }
- Start: asm {
- rep stosw // do it!
- }
- }
-
- Done!
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- ■ In closing
-
- This 3D system is still not perfect. It needs to be faster, and now I
- have also dumped the problem of face-sorting on you! Nyahahahaha!
-
- [ My sister and I were driving along the other day when she
- asked me, what would I like for my computer.
- I thought long and hard about it, and came up with the
- following hypothesis. When a girl gets a Barbie doll, she
- then wants the extra ballgown for the doll, then the
- hairbrush, and the car, and the house, and the friends
- etc.
- When a guy gets a computer, he wants the extra memory, the
- bigger hard drive, the maths co-pro, the better
- motherboard, the latest software, and the bigger monitor
- etc.
- I told my sister all of this, and finished up with : "So as
- you can see, computers are Barbie dolls for MEN!"
- She called me a chauvinist. And hit me. Hard.
- ]
- - Grant Smith
- 19:24
- 26/2/94
-
- See you next time!
- - Denthor
-
- These fine BBS's carry the ASPHYXIA DEMO TRAINER SERIES : (alphabetical)
-
- ╔══════════════════════════╦════════════════╦═════╦═══╦════╦════╗
- ║BBS Name ║Telephone No. ║Open ║Msg║File║Past║
- ╠══════════════════════════╬════════════════╬═════╬═══╬════╬════╣
- ║ASPHYXIA BBS #1 ║(031) 765-5312 ║ALL ║ * ║ * ║ * ║
- ║ASPHYXIA BBS #2 ║(031) 765-6293 ║ALL ║ * ║ * ║ * ║
- ║Connectix BBS ║(031) 266-9992 ║ALL ║ ║ * ║ * ║
- ╚══════════════════════════╩════════════════╩═════╩═══╩════╩════╝
-
- Open = Open at all times or only A/H
- Msg = Available in message base
- File = Available in file base
- Past = Previous Parts available
-
- Does no other BBS's ANYWHERE carry the trainer? Am I writing this for
- three people who get it from one of these BBS's each week? Should I go
- on? (Hehehehe ... I was pleased to note that Tut 8 was THE most
- downloaded file from ASPHYXIA BBS last month ... )
-
-